package xyz.riceball.beans;

import org.apache.commons.lang3.StringUtils;

/**
 * <p>
 *
 * </p>
 *
 * @author xiaovcloud
 * @since 2020/06/29 19:25
 */
public interface BeanDefinition {

    /**
     * 类:new 构造方法的方式创建bean时，需要告诉bean工厂怎么获取类的名称
     *
     * @return 。
     */
    Class<?> getBeanClass();

    /**
     * 工厂bean名：成员工厂方法的方式创建bean时，需要告诉bean工厂怎么获取工厂bean名
     *
     * @return 。
     */
    String getFactoryBeanName();

    /**
     * 工厂方法名:静态工厂方法的方式创建bean时，需要告诉bean工厂怎么获取工厂方法名
     *
     * @return 。
     */
    String getFactoryMethodName();

    /**
     * 初始化方法
     *
     * @return .
     */
    String getInitMethodName();

    /**
     * 销毁方法
     *
     * @return .
     */
    String getDestroyMethodName();

    /**
     * 校验bean定义的合法性
     *
     * @return 是否合法
     */
    default boolean validate() {
        // 没定义class,工厂bean或工厂方法没指定，则不合法。
        if (this.getBeanClass() == null) {
            if (StringUtils.isBlank(getFactoryBeanName()) || StringUtils.isBlank(getFactoryMethodName())) {
                return false;
            }
        }
        // 定义了类，又定义工厂bean，不合法
        return this.getBeanClass() == null || !StringUtils.isNotBlank(getFactoryBeanName());
    }
}
